<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  
  <link href="../css/style.css" rel="stylesheet" type="text/css">

</head>
<body>
<h1>4.5. Сложение и вычитание</h1>
<p class="article">
Для сложения двух чисел предназначена команда ADD. Она работает как с числами со знаком, так и с числами без знака (это особенность дополнительного кода).
Операнды должны иметь одинаковый размер (нельзя складывать 16- и 8-битное значение). Результат помещается на место первого операнда. В общем, эти правила справедливы для большинства команд.
После выполнения команды изменяются флаги, по которым можно определить характеристики результата:
</p>
<ul class="list">
	<li class="article">Флаг CF устанавливается, если при сложении произошёл перенос из старшего разряда. Для беззнаковых чисел это будет означать, что произошло переполнение и результат получился некорректным.
	</li>
	<li class="article">Флаг OF обозначает переполнение для чисел со знаком. </link>
	<li class="article">Флаг SF равен знаковому биту результата (естественно, для чисел со знаком, а для беззнаковых он равен старшему биту и особо смысла не имеет).
	</li>
	<li class="article">Флаг ZF устанавливается, если результат равен 0.</li>
	<li class="article">Флаг ZF устанавливается, если результат равен 0.</li>
</ul>
<div class="notewarning">
При выполнении арифметических оперций может возникнуть ситуация переполнения. 
В определённых местах надо следить за флагом OF. 
</div>
<div class="notetip">
С помощью флага CF можно производить арифметические операции над "длинными" числами.
</div>
<p class="article">
Примеры:
</p>
<pre class="code">
add ax,5        ;AX = AX + 5
add dx,cx       ;DX = DX + CX
add dx,cl       ;Ошибка: разный размер операндов.
</pre>
<p class="article">
Вычитание выполняется с помощью команды SUB. Результат также помещается на место первого операнда и опять же выставляются флаги. Единственная разница в том, что происходит вычитание, а не сложение.
На самом деле вычитание в процессоре реализовано с помощью сложения. Процессор меняет знак второго операнда на противоположный, а затем складывает два числа. Если вам необходимо в программе поменять знак числа на противоположный, можно использовать команду NEG. У этой команды всего один операнд.
</p>
<p class="article">
Примеры:
</p>
<pre class="code">
sub si,dx       ;SI = SI - DX
neg ax          ;AX = -AX
</pre>
<h2>Инкремент и декремент</h2>
<p class="article">
Очень часто в программах используется операция прибавления или вычитания единицы. Прибавление единицы называется инкрементом, а вычитание — декрементом. Для этих операций существуют специальные команды процессора: INC и DEC. Обратите внимание, что эти команды не изменяют значение флага CF.
</p>
</body>
</html>
